package com.ruoyi.pack.mapper;

import java.util.List;
import com.ruoyi.pack.domain.PackContainer;
import com.ruoyi.pack.domain.dto.PackContainerInventoryDTO;
import com.ruoyi.pack.domain.dto.PackContainerWarehouseInfoDTO;
import org.apache.ibatis.annotations.Param;

/**
 * 器具Mapper接口
 * 
 * @author ruoyi
 * @date 2024-01-01
 */
public interface PackContainerMapper 
{
    /**
     * 查询器具
     * 
     * @param containerId 器具主键
     * @return 器具
     */
    public PackContainer selectPackContainerByContainerId(Long containerId);

    /**
     * 查询器具列表
     * 
     * @param packContainer 器具
     * @return 器具集合
     */
    public List<PackContainer> selectPackContainerList(PackContainer packContainer);

    /**
     * 新增器具
     * 
     * @param packContainer 器具
     * @return 结果
     */
    public int insertPackContainer(PackContainer packContainer);

    /**
     * 修改器具
     * 
     * @param packContainer 器具
     * @return 结果
     */
    public int updatePackContainer(PackContainer packContainer);

    /**
     * 删除器具
     * 
     * @param containerId 器具主键
     * @return 结果
     */
    public int deletePackContainerByContainerId(Long containerId);

    /**
     * 批量删除器具
     * 
     * @param containerIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deletePackContainerByContainerIds(Long[] containerIds);

    /**
     * 根据器具编码查询器具
     * 
     * @param containerCode 器具编码
     * @return 器具
     */
    public PackContainer selectPackContainerByContainerCode(String containerCode);

    /**
     * 绑定定位器
     * 
     * @param containerId 器具ID
     * @param locatorId 定位器ID
     * @return 结果
     */
    public int bindLocator(@Param("containerId") Long containerId, @Param("locatorId") Long locatorId);

    /**
     * 解绑定位器
     * 
     * @param containerId 器具ID
     * @return 结果
     */
    public int unbindLocator(@Param("containerId") Long containerId);

    /**
     * 批量绑定定位器
     * 
     * @param containerId 器具ID
     * @param locatorIds 定位器ID列表
     * @return 结果
     */
    public int batchBindLocators(@Param("containerId") Long containerId, @Param("locatorIds") Long[] locatorIds);

    /**
     * 更新器具状态
     * 
     * @param containerId 器具ID
     * @param locationStatus 位置状态
     * @param businessStatus 业务状态
     * @param packingStatus 装箱状态
     * @return 结果
     */
    public int updateContainerStatus(@Param("containerId") Long containerId, 
                                    @Param("locationStatus") String locationStatus,
                                    @Param("businessStatus") String businessStatus,
                                    @Param("packingStatus") String packingStatus);

    /**
     * 更新器具装箱信息
     * 
     * @param containerId 器具ID
     * @param packingStatus 装箱状态
     * @param projectId 项目ID
     * @param materialCode 物料编码
     * @param materialName 物料名称
     * @param materialQuantity 物料数量
     * @param liningScheme 内衬方案
     * @return 结果
     */
    public int updateContainerPackingInfo(@Param("containerId") Long containerId,
                                        @Param("packingStatus") String packingStatus,
                                        @Param("projectId") Long projectId,
                                        @Param("materialCode") String materialCode,
                                        @Param("materialName") String materialName,
                                        @Param("materialQuantity") String materialQuantity,
                                        @Param("liningScheme") String liningScheme);

    /**
     * 更新器具定位信息
     * 
     * @param containerId 器具ID
     * @param latitude 纬度
     * @param longitude 经度
     * @param uploadTime 上传时间
     * @param locationLogId 定位日志ID
     * @param address 地址
     * @param province 省份
     * @param city 城市
     * @param district 区县
     * @return 结果
     */
    public int updateContainerLocationInfo(@Param("containerId") Long containerId,
                                         @Param("latitude") String latitude,
                                         @Param("longitude") String longitude,
                                         @Param("uploadTime") String uploadTime,
                                         @Param("locationLogId") Long locationLogId,
                                         @Param("address") String address,
                                         @Param("province") String province,
                                         @Param("city") String city,
                                         @Param("district") String district);

    /**
     * 库存统计查询
     * 
     * @param packContainer 查询条件
     * @return 库存统计结果
     */
    public List<PackContainerInventoryDTO> selectInventoryStatistics(PackContainer packContainer);

    /**
     * 查询器具可能进入的仓库信息
     * 根据器具的归属公司、器具型号编码和当前物料编码查询匹配的项目和仓库
     * 
     * @param companyId 器具归属公司ID  
     * @param materialCode 器具型号编码
     * @param currentMaterialCode 当前物料编码（可为空）
     * @return 器具可能进入的仓库信息列表
     */
    public List<PackContainerWarehouseInfoDTO> selectContainerPossibleWarehouses(
        @Param("companyId") Long companyId,
        @Param("materialCode") String materialCode,
        @Param("currentMaterialCode") String currentMaterialCode);
} 